神经网络的概念和基本用法
什么是人工神经网络,我的理解就是:举个不太恰当的例子,当你训练你的狗时,第一次给它一个橘子,跟它说这是橘子;下一次再给它橘子,看它还认不认识,如果不认识,继续告诉他,直到狗可以认出橘子为止。那么下次你就可以给它拿一个香蕉,问它这是不是橘子,如果它说不是,说明它已经被训练的差不多了。
我们来看一下官方定义:
神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。
1、人工神经元模型(如图)
对于每一个神经元j,它的输入神经元为xi(i=1,2,…n),输入神经元节点连接到神经元j的加权向量为:
由此可得神经元j的输入加权和为:
神经元j的输出状态为
用向量表示则为
2、转移函数
人工神经元的数学模型主要包括3部分功能:加权、求和与转移。各种不同的人工神经元数学模型的主要区别在于采用了不同的转移函数。
(1)、线性函数
(2)、阈值型函数
越阶函数
符号函数
(3)、非线性函数
3、实现简单的逻辑运算
这里我们用神经网络训练四个输入,使得最终的网络可以进行简单的逻辑运算。通过不断的训练,每次需要调整输入权值和阈值,公式如下:
这里k=1,2,3,4;t表示迭代次数,q表示阈值,d表示期望(理论)输出,y表示每次的实际输出。e表示误差。
(1)、这里的每个变量意思标出alpha、beta、error分别表示权值学习速率、阈值学习速率、误差。
(2)、这里用的是越阶阈值型函数(sgn.m)
(3)、输入、输出、测试函数(sjwltest.m)
(4)、结果验证,人机交互
由于是简单的逻辑运算,5次训练就可以了。可以看出输入两组值【0 1】和【1 1】进行逻辑运算,结果分别为0和1,是对的。
(5)、结果展示
从图中可以看出,这个简单的神经网络相当于将4个点分成了2类,本身直线上的点线性组合恰好为0,直线下面的点(圆圈表示)线性组合就小于0,函数值sgn(x1,x2)=0,直线上面(加号表示)线性组合就大于0的点函数值sgn(x1,x2)=1,这与我们逻辑运算得出的结论也是一致的。表明简单的神经网络可以解决线性可分问题。
从理论到编程实践,花了将近一天的时间,用BP神经网络实现了简单的逻辑异或运算。可能有人觉得,现在有那么多神经网络工具箱、模块,还有必要学习神经网络基础原理吗?
我的回答是:必须了解一些最基础的神经网络工作机制,因为再强大的深度网络也只是把一个个神经元进行了串并联起来的。并且,神经元的工作原理对我们编写任何程序、构建算法都有思考引领作用(比如随机概率、反馈调节等)。神经网络不管在机器学习、人工智能、还是大数据挖掘中都着什么样决定性作用,它的基本、机制思想对我们都是有着启迪、思考作用的!
4、要解决的问题
有四组输入(0,0)–>0、(0,1)–>1、(1,0)–>1、(1,1)–>0,这里一共有四个学习模式对。
输入的两个元素相同输出0,否则输出1,即实现逻辑异或运算。
5、算法方案
这里用神经网络训练四组输入输出,直到误差达到指定误差,停止。
用隐含层带有三个节点的神经网络解决该分类问题(该逻辑运算相当于是将其分为(0,0)、(1,1)和(0,1)、(1,0)两类的问题)
神经网络结构图
BP神经网络就是根据实际输出与期望输出调节连接权值及阈值,使其误差达到给定值,能够进行分类的目标。
这里用的激励函数
算法过程描述如下:
假设输入层–>隐含层权值用W,阈值用theta表示表示,隐含层到输出层权值用V表示,阈值用gamma表示。
为连接权值初始化,赋值区间为【-0.1,0.1】;
随机选取一个学习模式对提供给网络;
利用权值和阈值计算输入层输出;
计算隐含层神经元输入输出
这里有两个输入神经元,三个隐含层神经元,所以i = 1,2;j =1,2,3,K表示训练次数。
(5)、计算输出层各个神经元输入和输出(这里就一个输出神经元)
(6)、计算输出层神经元校正误差
(7)、隐含层各个神经元校正误差
(8)、修正隐含层至输出层连接权值和输出层神经元阈值
(9)、修正输入层至隐含层的连接权值和隐含层神经元阈值
(10)、随机选取下一个学习模式,直至4个模式对训练完毕;
(11)、判断全局误差E是否满足要求,若满足,转至(13);
(12)、学习次数加一,若小于规定最大次数(这里是2e+4即2万次),返回(2)继续。
(13)、结束。
6、代码
(1)、代码文本
clear,clc;
%输入
x=[0 0 1 1;0 1 0 1];
%期望输出
y=[0 1 1 0];
eps = 0.0001;
%输入层与隐含层连接权值
w=abs(unifrnd(-0.1,0.1,[2,3]));
%隐含层与输出层连接权值
w1=abs(unifrnd(-0.1,0.1,[1,3]));
%阈值
theta = unifrnd(-0.1,0.1,[1,4]);
%alpha,beta分别为输入层与隐含层、隐含层与输出层的学习速率
alpha=0.5;
beta = 0.5;
%误差限
er = 0.01;
ran = zeros(1,4);
error = ones(1,4);
error_ = sum(error);
%规定最大训练次数
n_max = 2e+4;
k = 0;
K = 0;
while(1)
ind = unidrnd(4);
for i = 1:4
if(i == ind)
ran(i) =ind;
break;
end
end
%隐含层的净输入
s = x(:,ind)'*w-theta(1:3);
%隐含层的净输出
b = sig(s);
%输出层净输入
L = b*w1'-theta(4);
%输出层净输出
c = sig(L);
error(ind) = 1/2*(y(ind)-c)^2
if(k>n_max)
disp('训练次数过大,不收敛!');
break;
end
if((sum(ran==[1 2 3 4])==4)&&(sum(abs(error))<=er))
w,w1,theta,k
break;
end
if(error_<=sum(abs(error)))
K = K+1;
if(mod(K,15)==0)
alpha = alpha-(sum(abs(error))-error_)*alpha;
end
end
%输出层各个神经元校正误差
d = (y(ind) - c)*sig(L)*(1-sig(L));
%隐含层各个神经元校正误差
e = (w1*d).*(sig(s).*(1-sig(s)));
%修正隐含层至输出层连接权值和阈值
w1 = w1+alpha*d*b;
theta(4) = theta(4)-alpha*d;
%修正输入层与隐含层连接权值与阈值
w = w+beta*[x(1,ind)*e;x(2,ind)*e];
theta(1:3) = theta(1:3)-beta*e;
k = k+1;
end
for i = 1:4
%隐含层的净输入
s = x(:,i)'*w-theta(1:3);
%隐含层的净输出
b = sig(s);
%输出层净输入
L = b*w1'-theta(4);
%输出层净输出
y1(i) = sig(L);
end
disp('理论输出应为:')
y
disp('实际输出为:')
y1
(2)、代码截图
下面(箭头处),只有满足所有模式都参与了神经网络的训练、并且全局误差满足指定精度才会结束训练。(这里还是46行,因为我把前面一个空行删了,所以,上移了一行,哈哈!)
1 2 3 4 5 6 | if(error_<=sum(abs(error))) K+K+1; if(mod(K,15)==0) alpha = alpha-(sum(abs(error))-error_)*alpha; end end |
这段代码意思是如果本次全局误差与上次相比,变大了,K自增1,考虑到随机性,不能一出现这种情况就调整学习速率。而是,如果累积15次(这15次可能是间断发生)出现本次全局误差与上次相比变大了的情况,考虑是不是学习速率过快的原因,就得调整学习速率alpha。
7、结果
结果给出了迭代次数与实际输出
可以看出在小于预定义的20000次训练次数,神经网络就收敛到指定精度0.01了,结果中的0.0571我们可以近似看作0,同理0.9343近似看作1,因为神经网络只是一种近似逼近输出模式,只要达到指定精度,我们就说它模式学习成功!
小小的那么几个神经元就能完成异或运算,可见神经元确实作用强大。而人脑有几百亿个神经元,这么多神经元从出生一直训练到现在,每个决定都是经过N多次训练的,我们的每个决策应该确实、肯定都是【最优】的,所以不要后悔自己所做的任何决策。一切都是最好的,人生也是如此。所以,加油吧!
猜你可能喜欢